package com.rpframework.utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

import static com.google.zxing.BarcodeFormat.CODE_39;
import static com.google.zxing.BarcodeFormat.QR_CODE;
import static com.rpframework.utils.MatrixToImageWriter.writeToFile;

/**
 * Zing架构
 * Created by jump on 2016/9/12.
 */
public class ZingUtils {

    private static final Logger log = LoggerFactory.getLogger(ZingUtils.class);

    private static final int size = 500, barWidth = 300, barHeight = 100;

    /**
     * 快速生成图形码
     *
     * @param text 文本
     * @param size 宽+高(正方形)
     * @param f    图形类型
     * @return 文件地址
     */
    private static File generateCode(String text, int size, BarcodeFormat f) {
        return generateCode(text, size, size, f);
    }

    /**
     * 快速生成图形码 +默认大小
     *
     * @param text 文本
     * @param f    图形类型
     * @return 文件地址
     */
    private static File generateCode(String text, BarcodeFormat f) {
        return generateCode(text, size, f);
    }

    /**
     * 快速生成条形码 +默认大小
     *
     * @param text 文本
     * @return 文件地址
     */
    public static File generateBarCode(String text, int width, int height) {
        return generateCode(text, width, height, CODE_39);
    }

    /**
     * 快速生成条形码 +默认大小
     *
     * @param text 文本
     * @return 文件地址
     */
    public static File generateBarCode(String text) {
        return generateBarCode(text, barWidth, barHeight);
    }


    /**
     * 快速生成图形码
     *
     * @param text   文本
     * @param width  宽
     * @param height 高
     * @param f      图形类型
     * @return 文件地址
     */
    private static File generateCode(String text, int width, int height, BarcodeFormat f) {
        //二维码的图片格式
        String format = "gif";
        Hashtable<EncodeHintType, String> hints = new Hashtable<>();
        //内容所使用编码
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        BitMatrix bitMatrix;
        try {
            bitMatrix = new MultiFormatWriter().encode(text, f, width, height, hints);
        } catch (WriterException e) {
            log.info(e.getMessage());
            throw new RuntimeException(e);
        }
        //生成二维码
        File outputFile = new File(System.getProperty("user.dir") + File.separator + System.currentTimeMillis() + "." + format);
        try {
            writeToFile(bitMatrix, format, outputFile);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return outputFile;
    }


    /**
     * 快速生成二维码
     *
     * @param text   文本
     * @param width  宽
     * @param height 高
     * @return 文件地址
     */

    private static File generateQRCode(String text, int width, int height) {
        return generateCode(text, width, height, QR_CODE);
    }

    /**
     * 快速生成二维码
     *
     * @param text 文本
     * @param size 正方形大小
     * @return 文件地址
     */
    private static File generateQRCode(String text, int size) {
        return generateQRCode(text, size, size);
    }

    /**
     * 快速生成二维码 默认尺寸大小
     *
     * @param text 文本
     * @return 文件地址
     */
    public static File generateQRCode(String text) {
        return generateQRCode(text, size);
    }
}